package ru.chezclif.lern.conread;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import ru.chezclif.lern.conread.parser.PathDataInputProperties;

/**
 * Распознование типа файла по содержимому
 * 
 * @author Vit
 * 
 */
public class FileParser implements PathDataInputProperties {
	
	@Override
	/**
	 *По параметру filePath находится файл, в ходе выполнения программы узнается, к какому типу он относится и передается следующим парсерам
	 *
	 *@param filePath полный путь к оперируемому файлу
	 *@param propertyBuffer хранилище данных для заполнения
	 */
	public void parseFile(String filePath, DataBuffer propertyBuffer) {
		FileReader fileReader;
		try {
			fileReader = new FileReader(filePath);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			if (!(bufferedReader.ready())) {
				throw new ru.chezclif.lern.conread.exceptions.EmptyFileExeption(filePath);
			}
			String standartLine = ""; // переменная для поочередного чтения каждой строки из файла
			while ((standartLine = bufferedReader.readLine()) != null) {
				if (!(standartLine.trim().equals(""))) {
					if (standartLine.charAt(0) == '#') {
						PropertyParser propertyParser = new PropertyParser();
						propertyParser.parseFile(filePath, propertyBuffer);
						break;
					}
					if (standartLine.charAt(0) == ';') {
						IniParser iniParser = new IniParser();
						iniParser.parseFile(filePath, propertyBuffer);
						break;
					}
					if (standartLine.charAt(0) == '<') {
						XmlParser xmlParser = new XmlParser();
						xmlParser.parseFile(filePath, propertyBuffer);
						break;
					}
				}
			}
			bufferedReader.close();
		} catch (FileNotFoundException e) {
			throw new ru.chezclif.lern.conread.exceptions.FileNotFoundException(e, filePath);
		} catch (IOException e) {
			throw new ru.chezclif.lern.conread.exceptions.FileNotFoundException(e, filePath);
		}
	}
}
